Unity Sprine Tool入門

September 06, 2022


Unity2022から公式でSpriteToolが利用できるようになりました

僕ま今まで曲線に沿ったオブジェクトの配置、移動はCinemachineの CinemachineSmoothPath などを利用して曲線を作成し、それに沿ってオブジェクトの配置をしていました

(ようやく)公式で使えるようになったということでその使い方をリファレンスから読み取ろうと思います

はじめに

Sprinesパッケージは現在の最新版である 1.0.1 を利用します

https://docs.unity3d.com/Packages/com.unity.splines/manual/index.html

(公式にはPreview版の2.0.0があるように見えますがUPMからは見えないため、1.0.1を利用します)

このパッケージにはスプラインを作成、編集、アセット保存、作成したスプラインに沿ったPostiion,Rotationを取得できる機能、サンプルが含まれます

利用できる環境は2022.1以降。今回は 2022.1.15f1 で利用

PackageManagerからUnity公式の Splines パッケージをインストール (Sampleは任意)

A5C76D0A407A8D028C39D7C84686D90A

パスの編集

GameObject > 3D Object > Spline の中に

  • Draw Spline TOol
  • Square
  • Circle

が存在しています 68EED9DE556FEBA9861540A179F97A42

Square と Circle はデフォルトで四角、丸のSplineを設定してあるデータを生成してくれます

CD011AB83AC0BA8B01F02CE0F2D80CFB

E514730DB92DD0577A218E894EA1756B

この頂点データを編集するにはSceneViewの Scene Tool Override で表示されているSpline編集ツールを利用します F67ECFA8DE66B7FC6E627529297BBEE3

こちらを押すとEditモードになり頂点をSceneViewから編集することができます

Sphere や Circle のようにSplineがループしているのは Closed にチェックが入っているからであり、一本の線を描く場合はチェックを下ろします

マウスでクリックした点に新しいポイントを追加するには Knot Placement Toolを利用します

6E87FE3CFF99CE56D6B105228E8D9B83

こちらをOnにした状態でSceneViewをクリックするとそのポイントがリストに追加されます。 ポイント地点にMeshObjectが存在する場合その表面に吸い付くようにポイントが配置されます

Escで編集モードを終了します

パスに沿ってオブジェクトを動かす

Splineは引いたパスから「座標」、「回転値」を求められます こちらを利用してパス上にオブジェクトを動かします

SplineはSplineContainerクラスのため、Serializefieldで値を取得します。

Evalute メソッドを利用することで t (パス全体を0~1とする)を入力値とし、その時の座標、前方ベクトル、垂直ベクトルを取得できます

これを利用し、毎フレーム SetPositionAndRotationでオブジェクトを動かしてみます

public class SplineTest : MonoBehaviour
{
	// Splineの設定
	[SerializeField] private SplineContainer _spline;

	private float _current;
	private float _length;


	private void Start()
	{
		_length = _spline.CalculateLength();
	}

	private void Update()
	{
		_current += Time.deltaTime * 0.3f;
		var t = Mathf.Min(_current, _length) / _length;

		// 座標、回転値を求める
		_spline.Evaluate(t, out var pos, out var tangent, out var upVector);
		var rotation = Quaternion.LookRotation(Vector3.Normalize(tangent), upVector);

		transform.SetPositionAndRotation(pos, rotation);
	}
}

簡単にパス上にオブジェクトを配置できました

また、 SplineAnimateを利用することでオブエジェクト移動を簡単に利用でき、かつループ処理や移動にイージングを適用することもできます

こちらはまた別の記事で紹介したいと思います